# 课后练习：
# 请编写一个文字游戏程序
# 玩家扮演 一位领主，要去 都城 参选 国王。 但是路途上有7座森林，每座森林里面可能会碰到一个妖怪： 鹰妖 和 狼妖。
# 所以你需要雇佣战士对付它们，可以雇佣 弓箭兵 或者 斧头兵
# 弓箭兵、 斧头兵、 狼妖、鹰妖 具有如下特征：
# 弓箭兵：
#     雇佣价： 100 灵石
#     最大生命值： 100
#     杀伤力
#         杀死鹰妖  ： 损耗生命值 20
#         杀死狼妖  :  损耗生命值 80

# 斧头兵：
#     雇佣价： 120 灵石
#     最大生命值： 120
#     杀伤力
#         杀死鹰妖  ： 损耗生命值 80
#         杀死狼妖  :  损耗生命值 20

# 游戏运行流程如下：
# 1.产生森林和妖怪
# 程序随机为7座森林分别产生 鹰妖或者狼妖。
# 然后在屏幕上打印出7座森林里面的妖怪 分别是什么。
# 注意，只显示10秒钟就会消失（这就是游戏考验玩家的记忆力，暂时可以用 打印20个换行 翻屏实现）。
#
# 2.雇佣战士
# 玩家有 1000 灵石，让玩家根据自己记忆的 妖怪种类和数量，选择 雇佣 多少个 弓箭兵 和 斧头兵。
# 每雇佣一个士兵，给他起一个名字。
#
# 3.然后开始征途，要通过7座森林，系统不会提示你森林里面是什么妖怪（玩家凭记忆回想），每座森林只能派出一个战士 去 消灭里面的 妖怪， 让玩家选择派出哪个战士。
# 如果 战士 生命值 损耗完，这个战士就死亡了，如果战士死亡，就得派出另外一名战士杀死妖怪。
# 每次通过森林后，玩家可以选择是否用灵石给 战士补养；
# 如果选择补养，消耗1个灵石可以为生命值加1，但是不可能超过最大生命值
#
# 这个游戏最后，一定要通过7座森林，才算通关，并且系统显示玩家剩余灵石。
# 最后 剩余灵石 越多越好，越有机会当选国王。
from random import randint
import time


# 玩家
class Player:
    def __init__(self, stoneNumber):
        self.stoneNumber = stoneNumber  # 灵石数量
        self.warriors = {}  # 拥有的战士，包括弓箭兵和斧头兵


# 战士
class Warrior:
    # 初始化参数是生命值
    def __init__(self, strength):
        self.strength = strength

    # 用灵石疗伤
    def healing(self, stoneCount):
        # 如果已经到达最大生命值，灵石不起作用，浪费了
        if self.strength == self.maxStrength:
            return

        self.strength += stoneCount

        # 不能超过最大生命值
        if self.strength > self.maxStrength:
            self.strength = self.maxStrength


# 弓箭兵 是 战士的子类
class Archer(Warrior):
    # 种类名称
    typeName = '弓箭兵'

    # 雇佣价 100灵石，属于静态属性
    price = 100

    # 最大生命值 ，属于静态属性
    maxStrength = 100

    # 初始化参数是生命值, 名字
    def __init__(self, name, strength=maxStrength):
        Warrior.__init__(self, strength)
        self.name = name

    # 和妖怪战斗
    def fightWithMonster(self, monster):
        if monster.typeName == '鹰妖':
            self.strength -= 20
        elif monster.typeName == '狼妖':
            self.strength -= 80
        else:
            print('未知类型的妖怪！！！')


# 斧头兵 是 战士的子类
class Axeman(Warrior):
    # 种类名称
    typeName = '斧头兵'

    # 雇佣价 120灵石
    price = 120

    # 最大生命值
    maxStrength = 120

    # 初始化参数是生命值, 名字
    def __init__(self, name, strength=maxStrength):
        Warrior.__init__(self, strength)
        self.name = name

    # 和妖怪战斗
    def fightWithMonster(self, monster):
        if monster.typeName == '鹰妖':
            self.strength -= 80
        elif monster.typeName == '狼妖':
            self.strength -= 20
        else:
            print('未知类型的妖怪！！！')


# 鹰妖
class Eagle:
    typeName = '鹰妖'


# 狼妖
class Wolf:
    typeName = '狼妖'


# 森林
class Forest:
    def __init__(self, monster):
        # 该森林里面的妖怪
        self.monster = monster


print('''
***************************************
****           游戏开始             ****
***************************************

'''
      )

# 森林数量
forest_num = 7

# 森林 列表
forestList = []

# 为每座森林随机产生 鹰妖或者 狼妖
notification = '前方森林里的妖怪是：'  # 显示在屏幕上的内容
for i in range(forest_num):
    typeName = randint(0, 1)
    if typeName == 0:
        forestList.append(Forest(Eagle()))
    else:
        forestList.append(Forest(Wolf()))

    notification += \
        f'第{i + 1}座森林里面是 {forestList[i].monster.typeName}  '

# 显示 妖怪信息
print(notification, end='')  # 加 end=’ '意思是末尾不换行，加空格
time.sleep(2)
for index in range(20):
    print('\n')


# 开始 闯关
def fighting(soldiers):
    lev = 0
    if len(soldiers.items()) > 0:
        if lev < 7:
            print(f'当前士兵有：{soldiers}')
            print(f'''
                    ***************************************
                    ****          第{lev + 1}关         ****
                    ***************************************

                    '''
                  )

            soldier = input('请输入要派出的士兵的名字：')
            if soldier in soldiers:
                if soldiers[soldier]['typeName'] == '弓箭兵':
                    archerInfo = Archer(soldier)
                    archerInfo.fightWithMonster(forestList[lev].monster)
                    if archerInfo.strength > 0:
                        lev += 1
                        print('过关')
                        soldiers[soldier]['strength'] = archerInfo.strength
                        fighting(soldiers)
                    else:
                        lev += 1
                        print(f'士兵{soldier}战死')
                        soldiers.pop(soldier)  # 删除战死的士兵
                        input('请输入要派出的士兵的名字：')
                else:
                    axemanInfo = Axeman(soldier)
                    axemanInfo.fightWithMonster(forestList[lev].monster)
                    print(axemanInfo.strength)
                    if axemanInfo.strength > 0:
                        lev += 1
                        print('过关')
                        soldiers[soldier]['strength'] = axemanInfo.strength
                        fighting(soldiers)
                    else:
                        lev += 1
                        print(f'士兵{soldier}战死')
                        soldiers.pop(soldier)  # 删除战死的士兵
                        input('请输入要派出的士兵的名字：')
            else:
                print('该士兵不存在')
        else:
            print('恭喜您，通过所有关卡！')
    else:
        print('士兵都战死了，通关失败')


# 雇佣 士兵。
def hireSoldiers(stoneNum):
    archerNames = input('请输入雇佣的弓箭兵的名称，用英文逗号隔开（价格：100，生命：100）：').split(',')
    axemanNames = input('请输入雇佣的斧头兵的名称，用英文逗号隔开（价格：120，生命：120）：').split(',')

    player = Player(stoneNum)  # 玩家拥有的灵石数量
    total = Archer.price * len(archerNames) + Axeman.price * len(axemanNames)
    if total > stoneNum:
        print(f'雇佣兵总价为{total}，灵石不够啦')
    else:
        # 雇佣的士兵信息
        soldiers = {}
        for name1 in archerNames:
            if name1 not in axemanNames:
                soldiers[name1] = {}
                soldiers[name1]['typeName'] = Archer.typeName
                soldiers[name1]['price'] = Archer.price
                soldiers[name1]['strength'] = Archer.maxStrength
                for name2 in axemanNames:
                    soldiers[name2] = {}
                    soldiers[name2]['typeName'] = Axeman.typeName
                    soldiers[name2]['price'] = Axeman.price
                    soldiers[name2]['strength'] = Axeman.maxStrength
            else:
                print('士兵名称已存在！')
                return

        player.warriors = soldiers  # 玩家拥有的战士，包括弓箭兵和斧头兵
        print('士兵雇用成功，让我们开始征途吧！')
        fighting(soldiers)


print('领主大人，您现在有 1000 灵石，请选择你要雇佣的兵种的数量！')
hireSoldiers(1000)

# menu = '''
# 请选择操作选项：
#    1 开始游戏
#    0 退出
# '''
# # 显示主菜单
# while True:
#     choice = input(menu)
#
#     if choice == '1':
#         start()
#     else:
#         break
